package cn.tedu.justone.pack02;

/**
 * ZZ：JustOne
 * VX：Andylau2020smile
 * DY：JustOne2018
 * ZT：《》
 */
public class Demo14_2_案例测试wait被notify通知过早的现象 {
    //
    //案例测试wait被notify通知过早的现象
    //案例测试wait被notify通知过早的现象
    //案例测试wait被notify通知过早的现象
    // 1,本案例测试wait被notify通知过早的现象，由于先的执行了notify，
    //   导致后面的wait无人唤醒。
    // 2,正常流程应该是：
    //   如果先执行了notify，则后面的wait不应该再执行
    //   如果先执行了wait，则后岳的notify一定能要唤醒它。
    // 3,下一个Demo看解决方案。
    //
    public static void main(String[] args) throws InterruptedException {

        MyGreen green = new MyGreen();

        Thread w = new Thread(green.r1);
        Thread n = new Thread(green.r2);

        n.start();//先notify();
        Thread.sleep(100);
        w.start();//后wait();

    }
}

class MyGreen{
    String lock = "刘景景";
    Runnable r1 = new Runnable() {
        @Override
        public void run() {
            try {
                synchronized (lock){
                    System.out.println("开始wait()");
                    lock.wait();
                    System.out.println("结束wait()");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
    Runnable r2 = new Runnable() {
        @Override
        public void run() {
            synchronized (lock){
                System.out.println("开始notify()");
                lock.notify();
                System.out.println("结束notify()");
            }
        }
    };
}


























